package algo3.juegoCarmenSanDiego.modelo;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xml.sax.SAXException;

public class Interpol {
	
	private Map<String,Ladron> ladrones = new HashMap<String, Ladron>();
	private List<Ladron> listaDeLadrones= new ArrayList<Ladron>();
	private String nombreDeLadron;
	private Map<Integer ,String> ladronSospechoso = new HashMap<Integer,String>();
	
	
	public Map<Integer ,String> getCaracteristicasSospechoso(){
		return ladronSospechoso;
	}
	
	public List<Ladron> getListaDeTodosLosLadrones(){
		return this.listaDeLadrones;

	}
	
	public void agregarLadron(Ladron ladron){
		ladrones.put(ladron.getNombre(),ladron);
	}
	
	public Ladron obtenerLadron(String nombre){
		return ladrones.get(nombre);
	}
	
	public Interpol() throws ParserConfigurationException, SAXException, IOException{
		this.cargarLadrones();
		ladronSospechoso.put(0, ""); //nombre
		ladronSospechoso.put(1, ""); //sexo 
		ladronSospechoso.put(2, ""); //hobby
		ladronSospechoso.put(3, ""); //pelo
		ladronSospechoso.put(4, ""); //senia
		ladronSospechoso.put(5, ""); //coche
	}
	
	public void setSospechosoNombre(String unNombre){
		ladronSospechoso.put(0, unNombre);
	}
	public void setSospechosoSexo(String unSexo){
		ladronSospechoso.put(1, unSexo);
	}
	public void setSospechosoHobby(String unHobby){
		ladronSospechoso.put(2, unHobby);
	}
	public void setSospechosoPelo(String unPelo){
		ladronSospechoso.put(3, unPelo);
	}
	public void setSospechosoSenia(String unaSenia){
		ladronSospechoso.put(4, unaSenia);
	}
	public void setSospechosoCoche(String unCoche){
		ladronSospechoso.put(5, unCoche);
	}
	
	public String getSospechosoNombre(){
		return ladronSospechoso.get(0);
	}
	
	public String getSospechosoSexo(){
		return ladronSospechoso.get(1);
	}
	public String getSospechosoHobby(){
		return ladronSospechoso.get(2);
	}
	public String getSospechosoPelo(){
		return ladronSospechoso.get(3);
	}
	public String getSospechosoSenia(){
		return ladronSospechoso.get(4);
	}
	public String getSospechosoCoche(){
		return ladronSospechoso.get(5);
	}
	
	
	
	
	private void cargarLadrones() throws ParserConfigurationException, SAXException, IOException{
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		DocumentBuilder db = dbf.newDocumentBuilder();
		Document doc = db.newDocument();
				
		DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
		DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
		
		File archivo = new File("ladrones.xml");
		
		doc = dBuilder.parse(archivo);
		doc.getDocumentElement().normalize();
		
		Element elementoLadrones = (Element)doc.getElementsByTagName("ladrones").item(0);
		Ladron ladron;
		for(int i=0; i< elementoLadrones.getChildNodes().getLength(); i++) {
			ladron = Ladron.cargarAMemoria((Element)elementoLadrones.getChildNodes().item(i));
			ladrones.put(ladron.getNombre(),ladron);
			listaDeLadrones.add(ladron);
		}
	}
	
	public List<String> listaDeLadronesSospechosos(){
		List<String> nombresDeSospechosos = new ArrayList<String>();
		for(int i=0; i < listaDeLadrones.size(); i++)
		{
			if (esSospechoso(listaDeLadrones.get(i)))
					nombresDeSospechosos.add(listaDeLadrones.get(i).getNombre());
		}
		return nombresDeSospechosos;
	}
	
	private boolean esSospechoso(Ladron unLadron) {
		for (int i = 1; i< unLadron.getListaDeAtributos().size(); i++)
			if (this.ladronSospechoso.get(i) != "")
				if(unLadron.getListaDeAtributos().get(i).compareTo(this.ladronSospechoso.get(i)) != 0)
					return false;
		return true;
	}

	public String getNombreDeLadron(){
		return (this.nombreDeLadron);
	}
	public Ladron getLadron(){
		return ladrones.get(this.nombreDeLadron);
	}

	public boolean verificarOrdenArresto() {
		return (listaDeLadronesSospechosos().size() == 1);
	}

	public void setNombreDeLadron(String nombre) {
		this.nombreDeLadron = nombre;
	}


}
